package com.syf.kit.core.dao;

import com.syf.core.kit.resource.DelegatedResource;
import com.syf.kit.core.dao.mapper.SyfMapper;
import com.syf.kit.core.dao.sql.JdbcSQLProcessor;

public interface SyfRdsDaoUtil extends DelegatedResource {
    /**
     * 提供sql jdbc操作工具，简单封装部分ORM（map、list、bean），适用于复杂SQL和多表查询
     */
    JdbcSQLProcessor getSQLProcessor();

    /**
     * 提供Mybatis-Plus通用mapper，便于单表操作
     */
    <T extends BaseDTO> SyfMapper<T> getMapper(Class<T> dtoClass);

    /**
     * 仅开启连接
     */
    void openConnection();

    /**
     * 关闭会话，关闭所有连接
     */
    void close();

    /**
     * 开启事务
     */
    void beginTransaction();

    /**
     * 关闭事务
     */
    void closeTransaction();

    /**
     * 提交事务
     */
    void commitTransaction();

    /**
     * 回滚事务
     */
    void rollbackTransaction();

    /**
     * 根据配置的DataSource的名称，获取对应数据源的SQLProcessor。警告：仅限于多数据源即Multiple
     */
    default JdbcSQLProcessor getSQLProcessor(String dsName) {
        return getSQLProcessor();
    }

    /**
     * 提供Mybatis-Plus通用mapper，便于单表操作
     */
    default <T extends BaseDTO> SyfMapper<T> getMapper(String dsName, Class<T> dtoClass) {
        return getMapper(dtoClass);
    }

    /**
     * 根据配置的DataSource的名称，open jdbc connection。警告：仅限于多数据源即Multiple
     */
    default void openConnection(String dsName) {
        openConnection();
    }

    /**
     * 根据配置的DataSource的名称，close jdbc connection。警告：仅限于多数据源即Multiple
     */
    default void close(String dsName) {
        close();
    }

    /**
     * 根据配置的DataSource的名称，开启事务，。警告：仅限于多数据源即Multiple
     */
    default void beginTransaction(String dsName) {
        beginTransaction();
    }

    /**
     * 根据配置的DataSource的名称，关闭事务，。警告：仅限于多数据源即Multiple
     */
    default void closeTransaction(String dsName) {
        closeTransaction();
    }

    /**
     * 根据配置的DataSource的名称，提交事务，。警告：仅限于多数据源即Multiple
     */
    default void commitTransaction(String dsName) {
        commitTransaction();
    }

    /**
     * 根据配置的DataSource的名称，回滚事务，。警告：仅限于多数据源即Multiple
     */
    default void rollbackTransaction(String dsName) {
        rollbackTransaction();
    }
}
